module Agencia (Agencia, nuevaA, nombreA, prospectosA, gurusA, sugerenciasA, inscribirseA, 
	quienTieneMasChancesDeBesarA, agenciasIgualesA)

where

import Tipos
import Persona
import Prospecto

data Agencia =  A Nombre [Guru] | Nuevo Prospecto Agencia deriving (Show)

nuevaA :: Nombre -> [Guru] -> Agencia
nuevaA n gs = A n gs

nombreA :: Agencia -> Nombre
nombreA (A n gs) = n
nombreA (Nuevo p a) = nombreA a

prospectosA :: Agencia -> [Prospectos]
prospectosA (A n gs) = []
prospectosA (Nuevo p a) = (p:prospectosA (a))

gurusA :: Agencia -> [Guru]
gurusA (A n gs) = gs
gurusA (Nuevo p a) = gurusA a

inscribirseA :: Agencia -> Persona -> (Sexo, (Edad, Edad)) -> Agencia
inscribirseA a p (s, (e1, e2)) = Nuevo (nuevoPR p s e1 e2) a

mismosElementos :: [a] -> [a] -> Bool
mismosElementos xs ys = (incluido xs ys) && (incluido ys xs)

incluido :: [a] -> [a] -> Bool 
incluido [] [] = True
incluido [] _  = True
incluido _ []  = False
incluido (x:xs) (y:ys) = pertenece x (y:ys) && incluido xs (y:ys)    

pertenece :: a -> [a] -> Bool
pertenece _ [] = False
pertenece x (y:ys) =  (x == y) || (pertenece x ys)

agenciasIgualesA :: Agencia -> Agencia -> Bool
agenciasIgualesA a1 a2
	|(nombreA a1 == nombre a2) && mismosElementos(gurus a1)(gurus a2) && mismosElementos(prospectosA a1)(prospectosA a2) 	= True
	|otherwise 																												= False	

quienTieneMasChancesDeBesar :: Agencia -> Prospecto
quienTieneMasChancesDeBesar(Nuevo p (A n gs)) = p
quienTieneMasChancesDeBesar(Nuevo p a)
				|sumaSugerencias p a >= quienTieneMasChancesDeBesar a	= p
				|otherwise												= quienTieneMasChancesDeBesar a
				
sumaSugerencias :: Prospecto -> Agencia -> Int
sumaSugerencias p a = (if  elem Conservador (gurusA a) then length(losConservadores p a) else 0) + 
(if  elem Desesperado  gurusA a then length(losDesesperados p a) else 0) + 
(if  elem Idealista  gurusA a then length(losIdealistas p a) else 0)


sugerenciasA :: Agencia -> Guru -> Prospecto -> [Prospectos]
sugerenciasA a Desesperado p = losDesesperados a p
sugerenciasA a Conservador p
sugerenciasA a Idealista p

losDesesperados :: Agencia -> Prospectos -> [Prospectos]
losDesesperados (A n gs) _ = []

losConservadores :: Agencia -> Prospectos -> [Prospectos]
losIdealistas :: Agencia -> Prospectos -> [Prospectos]
